/* (C)oded by ESPRIT 2014 - 3B2 - Undrained Group*/
/* Par: Harzli Joumen */

#include "configuration.h"
#include "dessiner.h"
#include "alertes.h"
#include "gestion_personnels.h"
#include <stdio.h>
#include <stdlib.h>

// lire la liste des capteurs depuis  events.txt
void extraire_events(parcours_info p[], int *n)
{
	FILE *f;
	f = fopen(FICHIER_EVENTS,"r");
	*n = 0;
        if ( f != NULL)
        {
                debug("Extraction des evenements enregistres du fichier");
                while ( fscanf(f,"%s %d %s",p[*n].temps,&p[*n].p_id,p[*n].c_id) != EOF)
                {
                        *n = *n + 1;
                }
                fclose(f);
		debug("les evenements sont chargees");
        }
	else
		debug("le fichier %s n'existe pas",FICHIER_EVENTS);


}

void definir_capteur(char capteur[] ,parcours_db parcours_demander[], int nombre_des_capteurs)
{
	int i = 0;
	int trouve = 0;
	while ((i < nombre_des_capteurs)&&(trouve==0))
	{
		if (strcmp(parcours_demander[i].m_id ,capteur ) == 0 )
		{
			decrypter_desc(parcours_demander[i].desc);
			printf("[!] %s: %s\n",capteur,parcours_demander[i].desc);
			trouve = 1;
		}
		i++;
	}
}


void definir_capteur_gtk(char capteur[] ,parcours_db parcours_demander[], int nombre_des_capteurs,char desc_[])
{
	int i;
	int trouve = 0;
	while ((i < nombre_des_capteurs)&&(trouve==0))
	{
	
		if (strcmp(parcours_demander[i].m_id ,capteur ) == 0 )
		{
			
			decrypter_desc(parcours_demander[i].desc);
			strcpy(desc_,parcours_demander[i].desc);
			trouve = 1;
		}
		i++;
	}
}


// associer les donnees du FICHIER_EVENTS au personnels
void associer_parcours_personnels(personnel_db personnel[], int nombre_des_personnels)
{
	int i,j,k;
	int nombre_des_capteurs;
	parcours_info parcours[500];

	extraire_events(parcours,&nombre_des_capteurs);

	if (nombre_des_capteurs != 0 )
	{
	i = 0;
	while( i < nombre_des_personnels)
	{

		k = 0;
		debug("Chargement du parcours du '%d %s %s'",personnel[i].id,personnel[i].nom,personnel[i].prenom);
		for ( j = 0; j < nombre_des_capteurs ; j++)
		{

			if ( parcours[j].p_id == personnel[i].id)
			{

				debug("Ajout du capteur %s ==> %s %s",parcours[j].c_id,personnel[i].nom,personnel[i].prenom);

				strcpy(personnel[i].parcours[k].m_id,parcours[j].c_id);

				personnel[i].nombre_capteurs = personnel[i].nombre_capteurs + 1;

				k++;
			}
		}
		i++;
	}
	}
	else debug("la liste des capteurs est vide");
}


// retourner 1 si le parcours suivit par le personnel est correct
int comparer_parcour(parcours_db parcours_du_personnel[], parcours_db parcours_demander[], int nombre_des_capteurs)
{
	int correct = 1;
	int i = 0;

	while ( ( i <nombre_des_capteurs ) && (correct))
	{
		if (strcmp(parcours_du_personnel[i].m_id,parcours_demander[i].m_id) != 0 )
		{
			correct = 0;
			printf("[!] le personnel a saute le capteur %s\n",parcours_demander[i].m_id);
			definir_capteur(parcours_demander[i].m_id,parcours_demander,nombre_des_capteurs);
		}
		else
			i++;
	}
	return correct;

}

int max_id_patient(patient_db patient[], int *nbre_patients)
{
	int i;
	int id_max;
	id_max = -1;
	for (i=0;i<*nbre_patients;i++)
		{
			if ( patient[0].id > id_max)
			{
				id_max = patient[0].id;
			}
		}
	id_max = id_max + 1;
	return id_max;
}

void personnel_vers_patient(personnel_db personnel, patient_db patient[], int *nbre_patients)
{
	strcpy(patient[*nbre_patients].nom,personnel.nom);
	strcpy(patient[*nbre_patients].prenom,personnel.prenom);
	strcpy(patient[*nbre_patients].passeport,personnel.passeport);
	patient[*nbre_patients].age = personnel.age;
	patient[*nbre_patients].id = max_id_patient(patient,nbre_patients);
	*nbre_patients = *nbre_patients + 1;
	printf("[!] le personnel est ajoute a la liste des patients\n");
}


// deplacer le personnel infecteé dans patients
void supprimer_personnel_infecte(personnel_db personnel[], patient_db patient[], int *nbre_personnels, int *nbre_patients, int id)
{
	char choix_[10];
	do
	{
		printf("[!] Vous voulez transformez le personnel vers la liste des patients ? (o/n): ");fflush(stdin);
		scanf("%s",choix_);
		if (strcmp( choix_, "o") == 0)
		{
			personnel_vers_patient(personnel[id],patient,nbre_patients);
			supprimer_personnel(personnel,personnel[id].id,nbre_personnels);
			exporter_patients(patient, *nbre_patients);
		}
	}
	while ( (strcmp( choix_,"o") != 0 ) && (strcmp( choix_,"n") != 0));
}

void decouvrir_personnel_infecte(personnel_db personnel[], int *nombre_des_personnel, patient_db patient[], int *nombre_des_patients, parcours_db parcours_demander[], int nombre_des_capteurs)
{
	int resultat = 0;
	int infraction = 0;
	printf("[!] Analyse...\n");

	// ATTENTION: il faut extraire chaque capteur et le associer a son personnel
	printf("[!] Le nombre des personnels est %d\n",*nombre_des_personnel);
	int i;
	i = (*nombre_des_personnel-1);

	if ( nombre_des_capteurs == 0)
		printf("[!] d'abord veuillez definir un parcours\n");
	else
	{
		while ( i >= 0)
		{
			dessiner_ligne(85);
			if (personnel[i].nombre_capteurs != 0)
			{
				printf("[!] Analyse du parcours du personnel '%s %s'\n",personnel[i].nom,personnel[i].prenom);
				if ( comparer_parcour(personnel[i].parcours,parcours_demander,nombre_des_capteurs) == 0 )
				{
					printf("[!] le personnel %s %s peut etre infecte\n",personnel[i].nom,personnel[i].prenom);
					supprimer_personnel_infecte(personnel,patient,nombre_des_personnel,nombre_des_patients,i);
					resultat = 1;
				}
				else
				{
					printf("[!] le personnel %s %s n'a pas fait des infractions\n",personnel[i].nom,personnel[i].prenom);
				}
			}
			else
			{
				printf("[!] Pas de parcours pour %s %s\n",personnel[i].nom,personnel[i].prenom);
			}
			i = i - 1;
			dessiner_ligne(85);
		}
	}
	if ( resultat == 0 )
		printf("[!] il n'y a pas des infractions\n");

}



// retourner 1 si le parcours suivit par le personnel est correct
int comparer_parcour_gtk(parcours_db parcours_du_personnel[], parcours_db parcours_demander[], int nombre_des_capteurs,char capteur[],char desc[])
{
	int correct = 1;
	int i = 0;

	while ( ( i <nombre_des_capteurs ) && (correct))
	{
		if (strcmp(parcours_du_personnel[i].m_id,parcours_demander[i].m_id) != 0 )
		{
			correct = 0;
			strcpy(capteur,parcours_demander[i].m_id);
			definir_capteur_gtk(parcours_demander[i].m_id,parcours_demander,nombre_des_capteurs,desc);
		}
		else
			i++;
	}
	return correct;

}



void decouvrir_personnel_infecte_gtk(personnel_db personnel[], int *nombre_des_personnel, patient_db patient[], int *nombre_des_patients, parcours_db parcours_demander[], int nombre_des_capteurs, personnel_infecte infraction[],int *nombre_des_infractions)
{
	*nombre_des_infractions = 0;
	char capteur[10];
	char desc[50];

	printf("[!] Analyse...\n");
	// il faut extraire chaque capteur et le associer a son personnel
	printf("[!] Le nombre des personnels est %d\n",*nombre_des_personnel);
	int resultat = 0;	
	int i = 0;
	i = *nombre_des_personnel-1; // pour les personnels qui ont un parcour

	if ( nombre_des_capteurs == 0)
		printf("[!] d'abord veuillez definir un parcours\n");
	else
	{
		while ( i >= 0)
		{
			if (personnel[i].nombre_capteurs != 0)
			{
				printf("[!] Analyse du parcours du personnel '%s %s'\n",personnel[i].nom,personnel[i].prenom);
				if ( comparer_parcour_gtk(personnel[i].parcours,parcours_demander,nombre_des_capteurs,capteur,desc) == 0 )
				{
					printf("[!] le personnel %s %s peut etre infecte\n",personnel[i].nom,personnel[i].prenom);
					strcpy(infraction[*nombre_des_infractions].nom,personnel[i].nom);
					strcpy(infraction[*nombre_des_infractions].prenom,personnel[i].prenom);
					strcpy(infraction[*nombre_des_infractions].capteur,capteur);
					strcpy(infraction[*nombre_des_infractions].desc,desc);					
															
					*nombre_des_infractions = *nombre_des_infractions + 1;
					resultat = 1;
				}
				else
				{
					printf("[!] le personnel %s %s n'a pas fait des infractions\n",personnel[i].nom,personnel[i].prenom);
				}
				
			} else printf("[!] Pas de parcours pour %s %s\n",personnel[i].nom,personnel[i].prenom);
			i = i - 1;
		}
	}
	if ( resultat == 0 )
		printf("[!] il n'y a pas des infractions\n");
}


